package es.udc.acs.cajero.ui;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import es.udc.acs.cajero.Cajero;
import es.udc.acs.cajero.operations.DBCajeroOperations;
import es.udc.acs.cajero.utils.GestorProperties;
import es.udc.acs.database.Database;
import es.udc.acs.utils.FormateadorDatos;

public class MainCajero {
	
	
	private MainCajero(){}
	
	public static void main(String[] args) {
		String banco = "";
		String tarjeta = "";
		BufferedReader br = 
				new BufferedReader(new InputStreamReader(System.in));
		Cajero cajero = initCajero(br);
		
		Database db = Database.getInstancia();
	
		try {
			db.establecerConexion();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		modoInicializar(cajero);
		
		while(true){
			
			System.out.println("Inserte banco:");
			
		    try {
				banco = (br.readLine());
			} catch (IOException e) {
				System.out.println("Opcion no valida.");
				e.printStackTrace();
			}
			
		    if (banco.length() != 8 ) {
		    	System.out.println("Tamaño incorrecto");
		    	continue;
		    }
		    
			System.out.println("Inserte tarjeta:");
			
		    try {
				tarjeta = (br.readLine());
				GestorProperties.setCajeroLog(cajero.getIdCajero());
			} catch (IOException e) {
				System.out.println("Opcion no valida.");
				e.printStackTrace();
			}
			
		    if (tarjeta.length() != 2 ) {
		    	System.out.println("Tamaño incorrecto");
		    	continue;
		    }
		    
			menu(br, cajero,banco+" "+tarjeta);			
		}
	}
	
    private static void modoInicializar(Cajero cajero) {
    	
		BufferedReader br = 
				new BufferedReader(new InputStreamReader(System.in));
		
		String op = "";
		
		while(true){
			System.out.println("Inicio limpio del cajero? (si/no)");
			
		    try {
				op = (br.readLine());
				System.out.println("");
			} catch (IOException e) {
				System.out.println("Opcion no valida.");
				e.printStackTrace();
			}
		    if (!op.equals("si") && !op.equals("no")){	
				System.out.println("Opcion no valida.");
			}else {
				if (op.equals("si")) {
					try {
						DBCajeroOperations.eliminarLogs(cajero.getIdCajero());
					} catch (Exception e) {
						System.out.println("Error al borrar entradas antiguas");
						e.printStackTrace();
					}
				}
				break;
			}
		}			
    }
	
	private static Cajero initCajero(BufferedReader br){
		String id;
		while (true){
			System.out.println("Introduce ID cajero:");

		 	try {
		 		id = (br.readLine());
		 		if (id.length() == 8) {
		 			return new Cajero(id);
		 		} else { 
					System.out.println("El id del cajero tiene un tamaño incorrecto.");
		 		}
			} catch (IOException e) {
				System.out.println("Id no valido.");
				e.printStackTrace();
			}
		}
		
	}
	
	private static void menu(BufferedReader br, Cajero cajero, String tarjeta){
		
		while(true){
			String op = "";
			String result = ""; 
			
			System.out.println("Seleccione operacion:");
			System.out.println("\t1.-Consulta saldo.");
			System.out.println("\t2.-Consulta movimientos.");
			System.out.println("\t3.-Solicitud reintegro.");
			System.out.println("\t4.-Solicitud abono.");
			System.out.println("\t5.-Solicitud traspaso.");
			System.out.println("\n\t6.- Salir.");
		    try {
				op = (br.readLine());
			} catch (IOException e) {
				System.out.println("Opcion no valida.");
				e.printStackTrace();
			}
			if (op.equals("1")){				
				result = cajero.consultaSaldo(tarjeta, getCuenta(br,""));				
			}else if (op.equals("2")){				
				result = cajero.consultaMovimientos(tarjeta, getCuenta(br,""));
			}else if (op.equals("3")){				
				result = cajero.solicitudReintegro(
						tarjeta, getCuenta(br,""), getImporte(br));				
			}else if (op.equals("4")){				
				result = cajero.solicitudAbono(
						tarjeta, getCuenta(br,""), getImporte(br));				
			}else if (op.equals("5")){				
				result = cajero.solicitudTraspaso(
						tarjeta, getCuenta(br,"origen"), 
						getCuenta(br,"destino"), getImporte(br));				
			}else if (op.equals("6")){
				break;
			}else System.out.println("Opcion no valida.");
			
			if (result != null) {
				formatearRespuesta(result, op);
	
				GestorProperties.tratarMensaje(
						cajero.getIdCajero(),
						"MainCajero:mensaje recibido: ", 
						result);
			} else {
				System.out.println("Consorcio no disponible");
			}
		}
	}
	
	private static void formatearRespuesta(String respuesta, String op) {
			
			System.out.println("");
			if (op.equals("1")){		
				FormateadorDatos.mostrarConsultaSaldo(respuesta,false,false);
			}else if (op.equals("2")){		
				FormateadorDatos.mostrarConsultaMovimientos(respuesta,false,false);
			}else if (op.equals("3")){		
				FormateadorDatos.mostrarReintegro(respuesta,false,false);
			}else if (op.equals("4")){		
				FormateadorDatos.mostrarAbono(respuesta,false,false);
			}else if (op.equals("5")){	
				FormateadorDatos.mostrarTraspaso(respuesta,false,false);
			}		
			System.out.println("");			
	}

	private static String getCuenta(BufferedReader br, String tipo){
		String cuenta = "";
		
		while(true) { 
			System.out.println("Seleccione cuenta "+tipo+"(1, 2 o 3):");
			
			try {
				 cuenta = (br.readLine());
			} catch (IOException e) {
				System.out.println("Opcion no valida.");
				e.printStackTrace();
			}
			
			if (cuenta.equals("1") 
					|| cuenta.equals("2") 
					|| cuenta.equals("3")) {
				return cuenta;
			}
			System.out.println("Cuenta incorrecta.");
		}
	}
	
	
	private static int getImporte(BufferedReader br) {
	
		int importe = 0;
		
		while(true) { 
			System.out.println("Escriba una cantidad:");
			
			try {
				 importe = Integer.parseInt(br.readLine());
			} catch (Exception e) {
				System.out.println("Cantidad no valida.");
			}
			
			if (importe > 0 && importe < 10000) {
				return importe;
			}

			System.out.println("Importe incorrecto (1-9999).");
		}
	}
	
}
